#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc,char* argv[])
{
	if(3 != argc)
	{
		printf("./myMove 文件名 目的文件名或目录名\n");
		return -1;
	}
	struct stat st = {0};
	int ret = stat(argv[1],&st);
	if(-1 == ret)
	{
		printf("获取文件%s状态失败:%m\n",argv[1]);
		return -2;
	}

	if(S_IFDIR&st.st_mode)
	{
		printf("只能移动文件，不能移动目录哟!\n");
		return -3;
	}

	int fdSrc = open(argv[1],O_RDONLY);
	if(-1 == fdSrc)
	{
		printf("打开文件失败:%m\n");
		return -3;
	}
	int fdDst;
	char buf[1024];



	ret = stat(argv[2],&st);
	if(-1 == ret)
	{
		printf("获取文件%s状态失败:%m\n",argv[2]);

		//把argv[1] 重命名为 argv[2]


		fdDst = open(argv[2],O_WRONLY | O_CREAT,0666);
		if(-1 == fdDst)
		{
			printf("创建拷贝后文件失败:%m\n");
			return -4;
		}

		//循环拷贝文件内容
		while(1)
		{
			ret = read(fdSrc,buf,1024);
			if(ret <= 0)
			{
				break;
			}
			write(fdDst,buf,ret);
		}
		//关闭文件
		close(fdSrc);close(fdDst);
		//删除待拷贝文件
		unlink(argv[1]);
		
		return -2;
	}

	


	if(S_IFDIR & st.st_mode)
	{
		//把argv[1] 拷贝到  argv[2] 目录下去
		char dstName[256] = {0};
		sprintf(dstName,"%s/%s",argv[2],argv[1]);

		//创建拷贝后文件
		fdDst = open(dstName,O_WRONLY | O_CREAT,0666);
		if(-1 == fdDst)
		{
			printf("创建拷贝后文件失败:%m\n");
			return -4;
		}

		//循环拷贝文件内容
		while(1)
		{
			ret = read(fdSrc,buf,1024);
			if(ret <= 0)
			{
				break;
			}
			write(fdDst,buf,ret);
		}
		//关闭文件
		close(fdSrc);close(fdDst);
		//删除待拷贝文件
		unlink(argv[1]);
	}
	else
	{
		//把argv[1] 重命名为 argv[2]


		fdDst = open(argv[2],O_WRONLY | O_CREAT,0666);
		if(-1 == fdDst)
		{
			printf("创建拷贝后文件失败:%m\n");
			return -4;
		}

		//循环拷贝文件内容
		while(1)
		{
			ret = read(fdSrc,buf,1024);
			if(ret<=0)
			{
				break;
			}
			write(fdDst,buf,ret);
		}
		//关闭文件
		close(fdSrc);close(fdDst);
		//删除待拷贝文件
		unlink(argv[1]);
	}

}